FLECHAS

La generalización de las mónadas

“Las flechas hacen explícita la dependencia del input” (John Hughes )

“Cuando definimos el interfaz a un componente software, queremos que revele lo menos posible de su implementación” (John Hughes)



El concepto de flecha

Una flecha (arrow en inglés) A b c es una estructura abstracta que representa una computación A de entrada de tipo b y que devuelve de salida un tipo c.


Las flechas guardan una relación con las funciones, pero no son funciones. Son categorías de funciones: las funciones de entrada b y salida c. Las flechas no explican ni detallan el cómo se obtiene c a partir de b. Las flechas son de tipo declarativo.

El concepto de flecha es más general que el de morfismo (también denominado “flecha”) de la teoría de categorías. Un morfismo es una relación entre un objeto A hacia otro objeto B de una categoría y que se representa como AB.

Las flechas suministran una disciplina para estructurar programas. Utilizan la analogía del circuito. El lenguaje de las flechas parece un lenguaje de definición de hardware. Los programas parecen estáticos y no se ve cómo se procesan los datos.

Hay diferentes tipos de flechas: divisores (splitters), conmutadores (switches), retardadores (delays), integradores, conversores de funciones en flechas (liftings), etc.


Flechas vs. Mónadas
Operaciones con flechas
  1. arr. Es el constructor principal. Convierte una función en una flecha.
    Si tenemos una función de tipo bc, podemos construir la flecha de tipo A b c (podemos leerlo como la flecha A de origen b y extremo c).


  2. >>>. Es el operador de composición de flechas. Es equivalente a “>>=” (bind) de las mónadas. Pone dos flechas en secuencia, conectando la salida de la primera flecha con la entrada de la segunda.



    Si la primera flecha es de tipo A b c, la segunda flecha debe ser de tipo A c d. La flecha resultante es de tipo A b d.

  3. first. Generaliza una flecha (dinámica) A b c en otra flecha con una parte estática d (presente en la entrada y en la salida) como segundo componente de entrada y de salida.



  4. second. Es la operación dual de first. Generaliza una flecha (dinámica) A b c en otra flecha con una parte estática d (presente en la entrada y en la salida) como primer componente de entrada y de salida.



  5. ***. Fusiona dos flechas en una, con dos tipos de componentes.


  6. &&&. Combina dos flechas que tienen la misma entrada en una flecha con las dos salidas.

Realmente solo existen tres combinaciones primitivas, que son las tres primeras. Las otras tres son combinaciones derivadas. Por ejemplo, *** es la combinación de first y second.


Ejemplo

Tenemos el gráfico siguiente:


A x y (flecha de entrada x y salida y)
A x z (flecha de entrada x y salida z)
y+z (suma de de las salidas de ambas flechas)


Transformadores de flecha (arrow transformers)

Un transformador de flecha es un tipo de flecha parametrizada sobre otro tipo de flecha, de tal manera que flechas del segundo tipo se pueden hacer corresponder con flechas del primero. De hecho, esto se corresponde con el concepto de funtor de la teoría de categorías. Con este mecanismo es posible construir una variedad infinita de flechas.


Implementación en MENTAL

En MENTAL, podemos hacer las siguientes consideraciones:

Adenda

Orígen de las flechas

El concepto de flecha fue introducido por John Hughes [2000, 2005], como generalización del concepto de mónada para el lenguaje funcional Haskell, motivado por la búsqueda de un analizador sintáctico (parser) eficiente, como una alternativa a los basados en mónadas, que eran poco eficientes y consumían mucha memoria.

Hughes se inspiró particularmente en el analizador sintáctico diseñado por Swierstra y Duponcheel [1996], que constaba de dos componentes secuenciales: uno rápido (estático), que evalúaba de forma general si la entrada merecía ser analizada, y otro lento (dinámico) que realizaba el trabajo de detalle. La notación que utilizó Hughes fue point-free.

Ross Patterson [2001] introdujo una nueva notación más fácil de usar con la que algunas leyes se podían expresar directamente. Pero esta nueva notación resultó ser insuficiente para el tratamiento general de las flechas.

Aunque el artículo de Hughes apareció en el 2000, con los parsers estilo flecha, una implementación práctica no estuvo disponible hasta Mayo de 2005: PArrows, desarrollado por Einar Karttunen.

Desde que Hughes publicó su primera definición en 2000, las leyes y las operaciones se han redefinido varias veces. Recientes formalizaciones [Lindley y otros, 2010] requieren solo 5 leyes.


Aplicaciones de las flechas

Las flechas se están aplicando en: analizadores sintácticos (parsers), diseño de circuitos, y metaprogramación (programas que generan programas). Y también en dos campos especiales:
Bibliografía